package com.woniuxy.controller;

import com.woniuxy.entity.AllRole;
import com.woniuxy.entity.DTO.RoleQueryDTO;
import com.woniuxy.service.IRoleService;
import com.woniuxy.util.PageResult;
import com.woniuxy.util.ResponseData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @Author pml
 * @Date 2025/7/16 10:05
 * @Description 角色管理控制器
 * 处理角色相关的所有HTTP请求
 * 采用RESTful API设计风格，与UserController保持一致
 */
@RestController
@RequestMapping("/role")
public class RoleController {

    @Autowired
    private IRoleService roleService;

    /**
     * 分页多条件查询角色列表
     * 使用GET请求，参数通过查询字符串传递
     * 与用户管理列表接口设计保持一致，降低学习成本
     */
    @GetMapping("/list")
    public ResponseData<PageResult<AllRole>> getRoleList(RoleQueryDTO queryDTO) {
        PageResult<AllRole> pageResult = roleService.getRoleList(queryDTO);
        return ResponseData.ok(pageResult);
    }

    /**
     * 根据ID查询单个角色
     * 路径参数方式传递角色ID，符合REST最佳实践
     */
    @GetMapping("/{roleId}")
    public ResponseData<AllRole> getRoleById(@PathVariable Integer roleId) {
        AllRole role = roleService.getById(roleId);
        return ResponseData.ok(role);
    }

    /**
     * 新增角色
     * 使用POST请求，JSON格式传递角色信息
     * 无需手动设置创建时间，由MyBatisPlus自动填充（参考User模块实现）
     */
    @PostMapping
    public ResponseData addRole(@RequestBody AllRole role) {
        boolean success = roleService.save(role);
        return success ? ResponseData.ok() : ResponseData.fail(500, "新增角色失败");
    }

    /**
     * 更新角色信息
     * 使用PUT请求，JSON格式传递更新信息
     * 全量更新模式，要求前端传递完整的角色对象
     */
    @PutMapping
    public ResponseData updateRole(@RequestBody AllRole role) {
        boolean success = roleService.updateById(role);
        return success ? ResponseData.ok() : ResponseData.fail(500, "更新角色失败");
    }

    /**
     * 根据ID删除单个角色
     * 使用DELETE请求，路径参数传递角色ID
     * 实际项目中建议使用逻辑删除，但根据现有数据库设计采用物理删除
     */
    @DeleteMapping("/{roleId}")
    public ResponseData deleteRole(@PathVariable("roleId") Integer roleId) {
        boolean success = roleService.removeById(roleId);
        return success ? ResponseData.ok() : ResponseData.fail(500, "删除角色失败");
    }

    /**
     * 批量删除角色
     * 使用DELETE请求，请求体传递角色ID列表
     * 支持一次删除多个角色，提高操作效率
     */
    @DeleteMapping("/batch")
    public ResponseData batchDeleteRole(@RequestBody List<Integer> roleIds) {
        boolean success = roleService.removeByIds(roleIds);
        return success ? ResponseData.ok() : ResponseData.fail(500, "批量删除失败");
    }
}
